package com.jeeplus.core.pdf;

import org.springframework.beans.factory.annotation.Value;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import java.io.IOException;

/**
 * Documents4j工具类
 *
 * @author liquanhong
 * @createTime 2023/12/05
 */
@Slf4j
@Service
public class Documents4jUtil {

    // windows 生成目录
    @Value("${winDirUrl}")
    private String winDirUrl;
    @Value("${linuxDirUrl}")
    private String linuxDirUrl;

    /**
     * word转pdf
     *
     * @param wordPath word源文件
     */
    public String convertWordToPdf(String wordPath) {
        String os = System.getProperty("os.name").toLowerCase();
        log.info("convertWordToPdf 当前操作系统：{}", os);
        if (os.contains("win")) {
            // Windows操作系统
            return windowsWordToPdf(wordPath, winDirUrl);
        } else if (os.contains("nix") || os.contains("nux") || os.contains("mac")) {
            // Unix/Linux/Mac操作系统
            return linuxWordToPdf(wordPath, linuxDirUrl);
        } else {
            // 未知操作系统
            throw new RuntimeException("不支持当前操作系统转换文档。");
        }
    }

    /**
     * 通过documents4j 实现word转pdf -- Windows 环境 需要有 Microsoft Office 服务
     *
     * @param wordPath 源文件
     * @param pdfPath  目标文件
     */
    public static String windowsWordToPdf(String wordPath, String pdfPath) {
        String command = "E:\\LibreOffice\\program\\soffice.exe --headless --invisible --convert-to pdf " + wordPath + " --outdir " + pdfPath;
        // 执行转换命令
        try {
            executeCmd(command);
            return pdfPath;
        } catch (Exception e) {
            log.error("linuxWordToPdf linux环境word转换为pdf时出现异常：", e);
        }
        return "";
    }

    /**
     * 通过libreoffice 实现word转pdf -- linux 环境 需要有 libreoffice 服务
     *
     * @param wordPath 源文件
     */
    public static String linuxWordToPdf(String wordPath, String pdfPath) {

        // 构建LibreOffice的命令行工具命令
        String command = "libreoffice --headless --invisible --convert-to pdf " + wordPath + " --outdir " + pdfPath;
        // 执行转换命令
        try {
            executeCmd(command);
        } catch (Exception e) {
            log.error("linuxWordToPdf linux环境word转换为pdf时出现异常：", e);
        }
        return pdfPath;
    }

    /**
     * 执行命令行
     *
     * @param cmd 命令行
     * @return
     * @throws IOException
     */
    private static boolean executeCmd(String cmd) throws IOException {
        Process process = Runtime.getRuntime().exec(cmd);
        try {
            process.waitFor();
        } catch (InterruptedException e) {
            log.error("executeLinuxCmd 执行Linux命令异常：", e);
            Thread.currentThread().interrupt();
            return false;
        }
        return true;
    }
}
